`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2023/03/24 20:45:50
// Design Name: 
// Module Name: sha3_fmax
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module sha3_fmax(
//    input   clk,
	input wire clk_in1_p,
    input wire clk_in1_n,
    input   rst_n,
//    input   enable,
	input	Poly_Start,
	input	Compare_cnt_fresh,
	output	Poly_Finish,
    
    input		[3:0]		open_addr0,
	// input		[3:0]		open_addr1,
	// input		[3:0]		result_addr,
	input		[5:0] 		func,
	input		[2:0]		RAM_CTR

    // output	valid_o,
	// output	valid_o_rej,
	// output	valid_o_bin,
	// output	done,
	//output	flag
    );
	wire clk;
	clk_wiz_0 u_clk_wiz_0
   (
    // Clock out ports
    .clk_out1(clk),     // output clk_out1
    // Status and control signals
    .resetn(rst_n), // input resetn
   // Clock in ports
    .clk_in1_p(clk_in1_p),    // input clk_in1_p
    .clk_in1_n(clk_in1_n));    // input clk_in1_n

    wire [95:0]	data_in;
    wire [95:0]	data_out_a;
    wire [95:0]	data_out_b;
    wire		 [9-1:0]	addr0;
	wire		 [9-1:0]	addr1;
	wire		 [9-1:0]	addr2;	
	wire		 [9-1:0]	addr3;	
	// sha3_wrap sha3_wrap_tb(
	// .clk			(clk),
	// .rst_n			(rst_n),
	// .enable			(enable),
	// .model			(model),
	
	// .data_in		(data_in),

	// .open_addr0		(open_addr0),
	// .open_addr1		(open_addr1),
	// .result_addr	(result_addr),

	// .addr0			(addr0),
	// .addr1			(addr1),
	// .addr2			(addr2),	
	// .addr3			(addr3),	
	
	// .data_out_a		(data_out_a),
	// .data_out_b		(data_out_b),

	// .valid_o		(valid_o),
	// .valid_o_rej	(valid_o_rej),
	// .valid_o_bin	(valid_o_bin),
	// .done			(done),
	// .flag			(flag)
	// );
wire [$clog2(32)-1:0] Poly_R3_AddrAL , Poly_R3_AddrBL;
 wire [$clog2(32)-1:0] Poly_R2_AddrAL , Poly_R2_AddrBL;
 wire Poly_R3_ena,Poly_R3_enb,Poly_R2_ena,Poly_R2_enb;
 wire Poly_R3_wea,Poly_R3_web,Poly_R2_wea,Poly_R2_web;
 wire [95:0] Poly_R2_DinA,Poly_R2_DinB;
 wire [95:0] Poly_R3_DinA,Poly_R3_DinB;

 wire InFuncPrintRAM;


 wire Poly_R1_request_a_ntt,Poly_R1_request_b_ntt,Poly_R1_request_b_pwm1,Poly_R1_request_b_polyadd,Poly_R1_request_a_encode,Poly_R1_request_b_encode; //RAM1访问标志
 wire [95:0] R2_DoutA_Poly,R2_DoutB_Poly,R3_DoutA_Poly,R3_DoutB_Poly;
	polyminalMultiplier #(.latency(6))
    thepolyminalMultiplier(
        .clk(clk),.rst_n(rst_n),.Start(Poly_Start),.Finish(Poly_Finish),
        .func(func),.RAM_CTR(RAM_CTR),
        .R2_ena(Poly_R3_ena),.R2_enb(Poly_R3_enb),.R1_ena(Poly_R2_ena),.R1_enb(Poly_R2_enb),
        .R2_wea(Poly_R3_wea),.R2_web(Poly_R3_web),.R1_wea(Poly_R2_wea),.R1_web(Poly_R2_web),
        .R2_DinA(Poly_R3_DinA)   ,.R2_DinB(Poly_R3_DinB),   .R1_DinA(Poly_R2_DinA)   ,.R1_DinB(Poly_R2_DinB)   ,        
        .R2_DoutA(R3_DoutA_Poly) ,.R2_DoutB(R3_DoutB_Poly), .R1_DoutA(R2_DoutA_Poly) ,.R1_DoutB(R2_DoutB_Poly) ,
        .R2_AddrAL(Poly_R3_AddrAL),.R2_AddrBL(Poly_R3_AddrBL),.R1_AddrAL(Poly_R2_AddrAL),.R1_AddrBL(Poly_R2_AddrBL),
        .Compare_cnt_fresh(Compare_cnt_fresh),.Compare_cnt(),

        //debug  信号
        .NTT_floor(),
        .NTT_busy(),
        .InFuncPrintRAM()
        
    );

    RAM2  u_RAM2( 
		.ena(Poly_R2_ena),
		.enb(Poly_R2_enb),
		.clka(clk), 
		.addra({open_addr0,Poly_R2_AddrAL}), 
		.dina(Poly_R2_DinA), 
		.douta(R2_DoutA_Poly), 

		.clkb(clk), 
		.addrb(Poly_R2_AddrBL), 
		.dinb(Poly_R2_DinB), 
		.doutb(R2_DoutB_Poly),
		.wea(Poly_R2_wea),
		.web(Poly_R2_web)
	);

	RAM3 u_RAM3 (
  		.clka(clk),    // input wire clka
  		.ena(Poly_R3_ena),      // input wire ena
  		.wea(Poly_R3_wea),      // input wire [0 : 0] wea
  		.addra({open_addr0,Poly_R3_AddrAL}),  // input wire [8 : 0] addra
  		.dina(Poly_R3_DinA),    // input wire [95 : 0] dina
  		.douta(R3_DoutA_Poly),  // output wire [95 : 0] douta

  		.clkb(clk),    // input wire clkb
  		.enb(Poly_R3_enb),      // input wire enb
  		.web(Poly_R3_web),      // input wire [0 : 0] web
  		.addrb(Poly_R3_AddrBL),  // input wire [8 : 0] addrb
  		.dinb(Poly_R3_DinB),    // input wire [95 : 0] dinb
  		.doutb(R3_DoutB_Poly)  // output wire [95 : 0] doutb
    );
endmodule
